package cn.tedu.springbootdemo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.context.ConfigurableApplicationContext;

/**
 * SpringBoot四大功能： 1.依赖管理 2.自动配置  3.打包   4.热部署
 * SpringBoot如何实现自动配置？ SpringBoot 启动类利用注解，开启自动配置的功能
 * 自动配置功能会根据Spring.factories 找到自动配置类 自动配置类中，利用一系列的条件注解，来完成Bean的初始化
 */

/**
 * AutoConfigurationImportSelector类中 getAutoConfigurationEntry方法流程介绍
 *
 * AnnotationAttributes attributes = getAttributes(annotationMetadata);
 * 获取@EnableAutoConfiguration 注解中的属性，比如exclude
 *
 * List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
 * 获取所有需要配置的自动配置类，本质上会读取spring.factories
 *
 * configurations = removeDuplicates(configurations);
 * 去除掉重复的自动配置类
 *
 * Set<String> exclusions = getExclusions(annotationMetadata, attributes);
 * 根据注解中的属性，获取需要排除的自动配置类
 *
 * checkExcludedClasses(configurations, exclusions);
 * 验证排除的自动配置类是否存在于候选的自动配置类中
 *
 * configurations.removeAll(exclusions);
 * 移除排除的自动配置类
 *
 */
@SpringBootApplication
//@EnableAutoConfiguration(exclude = DataSourceAutoConfiguration.class)// 排除DataSourceAutoConfiguration
public class SpringbootDemoApplication {

    //SpringBoot中自定义Bean配置和自动配置的顺序？

    public static void main(String[] args) {
        SpringApplication.run(SpringbootDemoApplication.class, args);
    }

}
